# -*- coding: utf-8 -*-

# @author Anderson R. Livramento
# Copyright (C) 2008 Anderson Rodrigues Livramento <anderdevel@users.sourceforge.net>
#
# O conteúdo deste arquivo está disponível dentro dos termos 
# da Licença Pública Geral GNU como publicada pela 
# Fundação do Software Livre (FSF); na versão 2 da Licença, ou
# (na sua opnião) qualquer versão mais recente.
#
# Este programa é distribuído na esperança que possa ser útil,
# mas SEM NENHUMA GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a
# qualquer MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a
# Licença Pública Geral GNU para maiores detalhes.
#
# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob
# o título "LICENCA.txt", junto com este programa; se não, escreva para
# a Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor,
# Boston, MA  02110-1301  US
#
"""Modulo que contem funcoes que operam de forma semelhante ao BeanUtils do Apache commons-beanutils."""

import types
import decimal
import datetime

RESERVED_PROPERTIES = ['c','mapper']
NUMBER_TYPES = [types.IntType,types.FloatType,types.LongType,decimal.Decimal]
LIST_TYPES = [types.ListType]

def __isreserved(prop):
    return (prop in RESERVED_PROPERTIES)

def get_properties(obj):
    return [attr for attr in dir(obj) if not callable(getattr(obj,attr)) and not attr.startswith('_') and not __isreserved(attr)]

def copy_properties(source,target):
    prop_targ = get_properties(target)
    if isinstance(source,dict):
        for key in prop_targ:
            if source.has_key(key):
                setattr(target,key,source[key])
        else:
            for key in prop_targ:
                if hasattr(source,key):
                    value = getattr(source,key,None)
                    setattr(target,key,value)

def copy_dict(dict_source,target):
    prop_targ = get_properties(target)
    for key in prop_targ:
        if dict_source.has_key(key):
            value = dict_source.get(key)
            setattr(target,key,value)

def object_to_dict(obj_source):
    props = get_properties(obj_source)
    result = {}
    for key in props:
        value = getattr(obj_source,key,None)
        if value != None:
            if isinstance(value,str):
                result[key] = value.decode('utf-8')
            else:
                if not isinstance(value,unicode):
                    if type(value) in NUMBER_TYPES:
                        if type(value) == decimal.Decimal:
                            result[key] = float(value)
                        else:
                            result[key] = value
                    elif type(value) == datetime.date:
                        result[key] = str(value)
                    elif type(value) in LIST_TYPES:
                        result_list = []
                        for i in value:
                            item = object_to_dict(i)
                            if item:
                                result_list.append(item)
                        result[key] = result_list
                    else:
                        result[key] = object_to_dict(value)
                else:
                    result[key] = value
        else:
            result[key] = value
    return result
